﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyDelegate
{
    /// <summary>
    /// 1.无参数无返回值委托
    /// </summary>
    public delegate void NoReturnNoParaOutClass();

    //所谓的委托：ILSpy反编译-识别底层---生成一个一个class, 如果定义在class外部：独立一个类出来，如果在内部，生成了一个类中类；
    //1. 构造函数
    //2. 实例方法
    // 委托的本质：就是一个类

    //实例化一个委托：必须要传入一个和当前委托的参数 和返回值完全吻合的方法；
    //如果执行委托--执行Invoke方法，就会把指向这个委托的方法给执行掉； 还是执行方法
    public class CustomDelegate // : MulticastDelegate
    {
        /// <summary>
        /// 2.无参数无返回值委托
        /// </summary>
        public delegate void NoReturnNoPara();
        /// <summary>
        /// 3.有参数无返回值委托
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public delegate void NoReturnWithPara(int x, int y);
        /// <summary>
        /// 4.无参数有返回值的委托
        /// </summary>
        /// <returns></returns>
        public delegate int WithReturnNoPara();
        /// <summary>
        /// 5.带参数，带返回值的委托
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public delegate int WithReturnWithPara(out int x, ref int y);

        public static void Show()
        {
            {
                NoReturnNoPara method = new NoReturnNoPara(NoReturnNoParaMethod);
                NoReturnNoPara method1 = NoReturnNoParaMethod;
                method.Invoke();
                //var result = method.BeginInvoke(null, null); //在.NET Framework 有效---启动一个线程来执行这个委托中指向的方法，在.NET Core 时代不再支持了； 
                //method.EndInvoke(result); //回调---现在都不支持了；


                ////可以传入一个lamdaba（匿名函数）
                //NoReturnNoPara method1 = new NoReturnNoPara(() => {

                //});
            }
            {
                NoReturnWithPara method1 = new NoReturnWithPara(NoReturnWithParaMethod);
                method1.Invoke(10, 30);
            }
        }


        public static void NoReturnNoParaMethod()
        {
            Console.WriteLine("this is NoReturnNoParaMethod~~~");
        }

        public static void NoReturnWithParaMethod(int x, int y)
        {
            Console.WriteLine("this is NoReturnWithParaMethod~~~");
        }


    }

    public class OtherClass
    {
        public void DoNothing()
        {
            Console.WriteLine("This is DoNothing");
        }
        public static void DoNothingStatic()
        {
            Console.WriteLine("This is DoNothingStatic");
        }
    }
}
